package com.jiangore.ws;

import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.interceptor.security.AuthenticationException;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.springframework.stereotype.Component;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import javax.xml.namespace.QName;

/**
 * @Todo
 * @Author jiangtao
 * @CreateBy 2020-03-15 8:58 PM
 * @UpdateBy jiangtao
 * @Version v1.0
 */
@Slf4j
//@Component
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    public AuthInterceptor() {
        super(Phase.PRE_PROTOCOL);
    }

    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {

        Header header = soapMessage.getHeader(new QName("header"));

        if(null == header){
            log.warn("token没有认证通过!原因为：客户端请求中不存在认证的Header");
            throw new Fault(new AuthenticationException("token没有认证通过!原因为：客户端请求中不存在认证的Header"));
        }
        Element ele = (Element) header.getObject();
        if(null == ele){
            log.warn("token没有认证通过!原因为：客户端请求中认证的Header无认证信息");
            throw new Fault(new AuthenticationException("token没有认证通过!原因为：客户端请求中认证的Header无认证信息"));
        }
        Node node = ele.getFirstChild();
        if(null == node){
            log.warn("token没有认证通过!原因为：客户端请求中认证的Header无认证信息");
            throw new Fault(new AuthenticationException("token没有认证通过!原因为：客户端请求中认证的Header无认证信息"));
        }
        String token = node.getTextContent();
        if(null == token || token.isEmpty()){
            log.warn("token没有认证通过!原因为：客户端请求中认证的Header无token信息");
            throw new Fault(new AuthenticationException("token没有认证通过!原因为：客户端请求中认证的Header无token信息"));
        }
        //Authorization auth = repository.findByToken(token);

        if(!"abc123".equals(token)){
            log.warn("token没有认证通过!原因为：客户端请求中认证的token信息无效，请查看申请流程中的正确token信息");
            throw new Fault(new AuthenticationException("token没有认证通过!原因为：客户端请求中认证的token信息无效，请查看申请流程中的正确token信息，流程申请地址:http://127.0.0.1:8080/email"));
        }
        log.info("客户端认证成功，token有效!");

    }
}
